package 实现_电影类_4_19;

/**
 * 需求：使用面向对象编程，魔法电影信息的展示
 * 分析：1.先设计一个电影类，再创建电影对象。
 *     2. 多部电影对象可以采用数组存储起来
 *     3. 一次遍历数组中的每个电影对象，取出其信息进行展示。
 */
import java.util.Arrays;
import java.util.Scanner;
public class Movie {

    //先创造 '电影类'数组类型 然后让用户传入数据指定数组大小
    private Node[] arr;
    //统计添加电影的有效数量
    private int size;



    //创建一个有参构造函数
    public Movie(int number){
        this.arr = new Node[number];
    }
    //再创建一个无参的构造函数，免的有些忘记了，设置个初始大小
    public Movie(){
        this(10);
    }

    //添加电影对象信息
    public void getAdd(String name, double score, String region, String performer) {

        arr[size] = new Node();//这一步很重要！！！
        //必须要为每个对象new出一块空间来存储信息，
        //而我们之前 new Movie[number]，这一步只是在堆区开辟了三块
        //只能保存对象地址的空间，你存一个数是没什么问题，但如果你想存储一堆数
        //还是需要为他们new一个 Movie 类型的空间

        arr[size].name = name;
        arr[size].score = score;
        arr[size].region = region;
        arr[size].performer = performer;

        size++;

        //考虑是否需要数组增容
        if(size == arr.length){
            grwo();
        }
    }

    //设计一个增容数组
    private void grwo(){

        this.arr = Arrays.copyOf(arr, arr.length * 2);
        System.out.println("扩容成功！ ");
    }
    //打印电影对象类
    @Override
    public String toString() {

        String rep = "";
        for (int i = 0; i < size; i++) {

            rep += "编号：" + (i + 1) + '\n';
            rep += "电影：" + arr[i].name + '\n';
            rep += "评分：" + arr[i].score + '\n';
            rep += "地区：" + arr[i].region + '\n';
            rep += "主演：" + arr[i].performer + '\n';
            if(i != size - 1){
                rep += "--------------------\n";
            }
        }

        return rep;
    }


    //查找
    //1. 给 索引值 打印该索引的信息
    public void Print(int sy){
        //判断输入编号是否正确
        if(sy < 0 || sy >= size){
            System.out.println("输入的索引值错误");
        }else{
            String rep = "";

            rep += "编号：" + (sy + 1) + '\n';
            rep += "电影：" + arr[sy].name + '\n';
            rep += "评分：" + arr[sy].score + '\n';
            rep += "地区：" + arr[sy].region + '\n';
            rep += "主演：" + arr[sy].performer + '\n';

            System.out.println(rep);
        }
    }

    //2. 输入名称，查找是否存在，存在则返回索引值，不存在返回 - 1
    private int get_Check(String name){

        for (int i = 0; i < size; i++) {

            String tmp = arr[i].name;
            if(tmp.equals(name)){
                return i;
            }
        }
        return -1;
    }
    //3.输入名称，查找是否存在，存在则打印相应的信息
    public void get_Check3(String name){

        int sy = get_Check(name);
        if(sy != -1){
            Print(sy);
        }else{
            System.out.println("抱歉，没有该电影");
        }
    }

    //删除功能
    //1. 按名字删除
    public void remove(String name) {

        if (size <= 0) {
            return;
        }
        int rep = get_Check(name);
        if (rep == -1) {
            System.out.println("没有这部电影");
            return;
        }
        for (int i = rep; i < size - 1; i++) {

            arr[i] = arr[i + 1];
        }
        size--;

    }
    //2. 按编号删除
    public void remove1(int id){
        //判断输入编号是否正确
        id -= 1;
        if(id < 0 || id >= size){
            System.out.println("编号输入错误");
        }else{
            int x = size;
            size = id;
            remove(arr[id].name);
        }
    }

    //插入
    //1. 输入编号插入电影内容
    public void insert(int id){
        id -= 1;
        if(id < 0 || id > size){
            System.out.println("编号输入有误，插入不成功");
        }else{
            for (int i = size; i > id ; i--) {

                arr[i] = arr[i - 1];
            }
            Node g = new Node();
            Scanner sc = new Scanner(System.in);
            System.out.print("电影的名称：");
            g.name = sc.next();
            System.out.print("电影的评分：");
            g.score = sc.nextDouble();
            System.out.print("电影的地区：");
            g.region = sc.next();
            System.out.print("电影的主演：");
            g.performer = sc.next();
            System.out.println();
            arr[id] = g;
            size++;
        }

    }


}

class Node{

    //创建一些接受电影参数的 成员变量
    public String name;//名称
    public double score;//评分
    public String region;//地区
    public String performer;//主演

}